package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.ChoferDAO;
import mx.ipn.persistencia.dao.DireccionDAO;
import mx.ipn.persistencia.dao.PersonaDAO;
import mx.ipn.to.ChoferTO;
import mx.ipn.to.PersonaTO;
import mx.ipn.to.DireccionTO;
import mx.ipn.to.FechaHoraTO;

public class ChoferDAOMySQL implements ChoferDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(ChoferDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO chofer (fecha_ingreso,numero_tarjeton,fecha_vencimiento_tarj,id_persona,activo) VALUES(?,?,?,?,?)";
	private static final String ACTIVADESACTIVACHOFER = "UPDATE chofer SET  activo=? WHERE id_chofer=?";
	private static final String UPDATE = "UPDATE chofer SET fecha_ingreso=?,numero_tarjeton=?,fecha_vencimiento_tarj=?,id_persona=?,activo=? WHERE id_chofer=?";
	
	private static final String FINDBYID = "SELECT * FROM chofer WHERE id_chofer=?";
	private static final String FINDBYNUMEROTARJETON = "SELECT * FROM chofer WHERE numero_tarjeton=?";
	
	private static final String SELECT = "SELECT * FROM chofer";
	private static final String SELECTACTIVO = "SELECT * FROM chofer WHERE activo=true";
	private static final String SELECTACTIVOBYRANGOFECHAVENCIMIENTO = "SELECT * FROM chofer WHERE fecha_vencimiento_tarj>=? AND fecha_vencimiento_tarj<=? AND activo=true";
	private static final String SELECTACTIVOBYNOMBREAPELLIDOPATERNO = "SELECT id_chofer,fecha_ingreso,numero_tarjeton,fecha_vencimiento_tarj,activo,Persona.id_persona,curp,nombre,apellido_paterno,apellido_materno,fecha_nacimiento,sexo,telefono,movil,id_direccion FROM persona JOIN chofer ON chofer.id_persona = persona.id_persona AND nombre=? AND apellido_paterno=? AND chofer.activo=true";
	private static final String SELECTBYNOMBREAPELLIDOPATERNO = "SELECT id_chofer,fecha_ingreso,numero_tarjeton,fecha_vencimiento_tarj,activo,Persona.id_persona,curp,nombre,apellido_paterno,apellido_materno,fecha_nacimiento,sexo,telefono,movil,id_direccion FROM persona JOIN chofer ON chofer.id_persona = persona.id_persona AND nombre=? AND apellido_paterno=?";

	@Override
	public short activaDesactivaChofer(int idChofer, boolean activo) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(ACTIVADESACTIVACHOFER);

			ps.setBoolean(1, activo);
			ps.setInt(2, idChofer);

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	@Override
	public ChoferTO findChoferById(int idChofer) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);
			ps.setInt(1, idChofer);
			ResultSet rs = ps.executeQuery();

			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

			PersonaDAO personaDAO = fabricaMySQL.getPersonaDAO();

			if (rs.next()) {
				idChofer = rs.getInt("id_chofer");
				java.sql.Date fechaIngreso = rs.getDate("fecha_ingreso");
				String numeroTarjeton = rs.getString("numero_tarjeton");
				java.sql.Date fechaVencimientoTarj = rs
						.getDate("fecha_vencimiento_tarj");
				PersonaTO personaTO = personaDAO.findPersonaById(rs
						.getInt("id_persona"));
				boolean activo = rs.getBoolean("activo");

				ChoferTO choferTO = new ChoferTO(idChofer, fechaIngreso,
						numeroTarjeton, fechaVencimientoTarj, personaTO, activo);

				ps.close();
				conexion.close();
				return choferTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ChoferTO findChoferByNumeroTarjeton(String numeroTarjeton) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(FINDBYNUMEROTARJETON);
			ps.setString(1, numeroTarjeton);
			ResultSet rs = ps.executeQuery();

			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

			PersonaDAO personaDAO = fabricaMySQL.getPersonaDAO();

			if (rs.next()) {
				int idChofer = rs.getInt("id_chofer");
				java.sql.Date fechaIngreso = rs.getDate("fecha_ingreso");
				numeroTarjeton = rs.getString("numero_tarjeton");
				java.sql.Date fechaVencimientoTarj = rs
						.getDate("fecha_vencimiento_tarj");
				PersonaTO personaTO = personaDAO.findPersonaById(rs
						.getInt("id_persona"));
				boolean activo = rs.getBoolean("activo");

				ChoferTO choferTO = new ChoferTO(idChofer, fechaIngreso,
						numeroTarjeton, fechaVencimientoTarj, personaTO, activo);

				ps.close();
				conexion.close();
				return choferTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertChofer(ChoferTO choferTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setDate(1, FechaHoraTO.getFecha(choferTO.getFechaIngreso()));
			ps.setString(2, choferTO.getNumeroTarjeton());
			ps.setDate(3, FechaHoraTO.getFecha(choferTO.getFechaVencimientoTarj()));
			ps.setInt(4, choferTO.getIdPersona());
			ps.setBoolean(5, choferTO.getActivo());
			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<ChoferTO> selectChofer() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;

			PersonaDAO personaDAO = null;

			ArrayList<ChoferTO> choferTO = null;
			ChoferTO choferTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (choferTO == null) {
					choferTO = new ArrayList<ChoferTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
					personaDAO = fabricaMySQL.getPersonaDAO();
				}

				int idChofer = rs.getInt("id_chofer");
				java.sql.Date fechaIngreso = rs.getDate("fecha_ingreso");
				String numeroTarjeton = rs.getString("numero_tarjeton");
				java.sql.Date fechaVencimientoTarj = rs
						.getDate("fecha_vencimiento_tarj");
				PersonaTO personaTO = personaDAO.findPersonaById(rs
						.getInt("id_persona"));
				boolean activo = rs.getBoolean("activo");

				choferTO2 = new ChoferTO(idChofer, fechaIngreso,
						numeroTarjeton, fechaVencimientoTarj, personaTO, activo);

				choferTO.add(choferTO2);
			}
			ps.close();
			conexion.close();
			return choferTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<ChoferTO> selectChoferActivo() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			

			PersonaDAO personaDAO = null;

			ArrayList<ChoferTO> choferTO = null;
			ChoferTO choferTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTACTIVO);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (choferTO == null) {
					choferTO = new ArrayList<ChoferTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
					personaDAO = fabricaMySQL.getPersonaDAO();
				}

				int idChofer = rs.getInt("id_chofer");
				java.sql.Date fechaIngreso = rs.getDate("fecha_ingreso");
				String numeroTarjeton = rs.getString("numero_tarjeton");
				java.sql.Date fechaVencimientoTarj = rs
						.getDate("fecha_vencimiento_tarj");
				PersonaTO personaTO = personaDAO.findPersonaById(rs
						.getInt("id_persona"));
				boolean activo = rs.getBoolean("activo");

				choferTO2 = new ChoferTO(idChofer, fechaIngreso,
						numeroTarjeton, fechaVencimientoTarj, personaTO, activo);

				choferTO.add(choferTO2);
			}
			ps.close();
			conexion.close();
			return choferTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<ChoferTO> selectChoferActivoByNombreApellidoPaterno(
			String nombre, String apellidoPaterno) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			

			DireccionDAO direccionDAO = null;

			ArrayList<ChoferTO> choferTO = null;
			ChoferTO choferTO2 = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTACTIVOBYNOMBREAPELLIDOPATERNO);
            ps.setString(1, nombre);
            ps.setString(2, apellidoPaterno);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (choferTO == null) {
					choferTO = new ArrayList<ChoferTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
					direccionDAO = fabricaMySQL.getDireccionDAO();
				}

				int idChofer = rs.getInt("id_chofer");
				java.sql.Date fechaIngreso = rs.getDate("fecha_ingreso");
				String numeroTarjeton = rs.getString("numero_tarjeton");
				java.sql.Date fechaVencimientoTarj = rs
						.getDate("fecha_vencimiento_tarj");
				int idPersona = rs.getInt("persona.id_persona");
				String curp = rs.getString("curp");
				nombre = rs.getString("nombre");
				apellidoPaterno = rs.getString("apellido_paterno");
				String apellidoMaterno = rs.getString("apellido_materno");
				java.sql.Date fechaNacimiento = rs.getDate("fecha_nacimiento");
				boolean sexo = rs.getBoolean("sexo");
				String telefono = rs.getString("telefono");
				String movil = rs.getString("movil");
				DireccionTO direccionTO = direccionDAO.findDireccionById(rs
						.getInt("id_direccion"));
				boolean activo = rs.getBoolean("activo");

				choferTO2 = new ChoferTO(idPersona, curp, nombre,
						apellidoPaterno, apellidoMaterno, fechaNacimiento,
						sexo, telefono, movil, direccionTO, idChofer,
						fechaIngreso, numeroTarjeton, fechaVencimientoTarj,
						activo);

				choferTO.add(choferTO2);
			}
			ps.close();
			conexion.close();
			return choferTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<ChoferTO> selectChoferActivoByRangoFechaVencimiento(
			Date inicio, Date fin) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
		
			FabricaDeDAOs fabricaMySQL = null;
		

			PersonaDAO personaDAO = null;

			ArrayList<ChoferTO> choferTO = null;
			ChoferTO choferTO2 = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTACTIVOBYRANGOFECHAVENCIMIENTO);
			ps.setDate(1, inicio);
			ps.setDate(2, fin);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (choferTO == null) {
					choferTO = new ArrayList<ChoferTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
					personaDAO = fabricaMySQL.getPersonaDAO();
				}

				int idChofer = rs.getInt("id_chofer");
				java.sql.Date fechaIngreso = rs.getDate("fecha_ingreso");
				String numeroTarjeton = rs.getString("numero_tarjeton");
				java.sql.Date fechaVencimientoTarj = rs
						.getDate("fecha_vencimiento_tarj");
				PersonaTO personaTO = personaDAO.findPersonaById(rs
						.getInt("id_persona"));
				boolean activo = rs.getBoolean("activo");

				choferTO2 = new ChoferTO(idChofer, fechaIngreso,
						numeroTarjeton, fechaVencimientoTarj, personaTO, activo);

				choferTO.add(choferTO2);
			}
			ps.close();
			conexion.close();
			return choferTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<ChoferTO> selectChoferByNombreApellidoPaterno(
			String nombre, String apellidoPaterno) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			

			DireccionDAO direccionDAO = null;

			ArrayList<ChoferTO> choferTO = null;
			ChoferTO choferTO2 = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYNOMBREAPELLIDOPATERNO);

			ps.setString(1, nombre);
            ps.setString(2, apellidoPaterno);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (choferTO == null) {
					choferTO = new ArrayList<ChoferTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
					direccionDAO = fabricaMySQL.getDireccionDAO();
				}

				int idChofer = rs.getInt("id_chofer");
				java.sql.Date fechaIngreso = rs.getDate("fecha_ingreso");
				String numeroTarjeton = rs.getString("numero_tarjeton");
				java.sql.Date fechaVencimientoTarj = rs
						.getDate("fecha_vencimiento_tarj");
				int idPersona = rs.getInt("persona.id_persona");
				String curp = rs.getString("curp");
				nombre = rs.getString("nombre");
				apellidoPaterno = rs.getString("apellido_paterno");
				String apellidoMaterno = rs.getString("apellido_materno");
				java.sql.Date fechaNacimiento = rs.getDate("fecha_nacimiento");
				boolean sexo = rs.getBoolean("sexo");
				String telefono = rs.getString("telefono");
				String movil = rs.getString("movil");
				DireccionTO direccionTO = direccionDAO.findDireccionById(rs
						.getInt("id_direccion"));
				boolean activo = rs.getBoolean("activo");

				choferTO2 = new ChoferTO(idPersona, curp, nombre,
						apellidoPaterno, apellidoMaterno, fechaNacimiento,
						sexo, telefono, movil, direccionTO, idChofer,
						fechaIngreso, numeroTarjeton, fechaVencimientoTarj,
						activo);

				choferTO.add(choferTO2);
			}
			ps.close();
			conexion.close();
			return choferTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateChofer(ChoferTO choferTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setDate(1, FechaHoraTO.getFecha(choferTO.getFechaIngreso()));
			ps.setString(2, choferTO.getNumeroTarjeton());
			ps.setDate(3, FechaHoraTO.getFecha(choferTO.getFechaVencimientoTarj()));
			ps.setInt(4, choferTO.getIdPersona());
			ps.setBoolean(5, choferTO.getActivo());
			ps.setInt(6, choferTO.getIdChofer());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

}
